/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.unipar.cursoweb.controle;

import br.com.unipar.cursoweb.modelo.*;
import br.com.unipar.cursoweb.service.ClienteService;
import br.com.unipar.cursoweb.service.FuncionarioService;
import br.com.unipar.cursoweb.service.OsService;
import br.com.unipar.cursoweb.service.ServicoService;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Named;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Thiago
 */
@Controller
@Scope("request")
@Named("osBean")
public class OsBean {

    private final OsService ordemServicoService;
    private final ServicoService servicoService;
    private final ClienteService clienteService;
    private final FuncionarioService funcionarioService;
    private OrdemServico os = new OrdemServico();
    private List<OrdemServico> ordensServico;
    private ItensOrdemServico item = new ItensOrdemServico();
    private List<ItensOrdemServico> itens;
    private List<Cliente> clientes;
    private List<Funcionario> funcionarios;
    private List<Servico> servicos;
    private Servico servico;
    private String cpfConsultaCliente;
    private String cpfConsultaFuncionario;
    private Boolean ativoInativoConsultaServico;

    @Autowired
    public OsBean(OsService ordemServicoService, ServicoService servicoService, ClienteService clienteService, FuncionarioService funcionarioService) {
        this.ordemServicoService = ordemServicoService;
        this.servicoService = servicoService;
        this.clienteService = clienteService;
        this.funcionarioService = funcionarioService;
    }

    @PostConstruct
    public void init() {
    }
    public void validatorCliente(FacesContext context, UIComponent component, Object value) {
        if (os.getCliente() == null) {
            ((UIInput) component).setValid(false);
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Selecione um Cliente", null);
            context.addMessage(component.getClientId(context), message);
        }
    }
    public String novo() {
        os = new OrdemServico();
        return "/movimentos/osForm.jsf";
    }

    public void consultar(ActionEvent evt) {
        ordensServico = ordemServicoService.consultar();
    }

    public void consultarFuncionario(ActionEvent evt) {
        funcionarios = funcionarioService.consulta(cpfConsultaFuncionario);
    }

    public void consultarServico(ActionEvent evt) {
        servicos = servicoService.consultar(null);
    }

    public void consultarCliente(ActionEvent evt) {
        clientes = clienteService.consultar(cpfConsultaCliente);

    }

    public void salvar(ActionEvent evt) {
        try {
            os = ordemServicoService.salvar(os);
            FacesContext.getCurrentInstance().getExternalContext().redirect("osLista.jsf");
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public String editar() {
        os = ordemServicoService.getById(os.getIdOrdemServico());
        return "/movimentos/osForm.jsf";
    }

    public void adicionarServico(ActionEvent event) {
        System.out.println("teste " + servico.getNome());
        ItensOrdemServico i = new ItensOrdemServico();
        i.setServico(servico);
        i.setValor(servico.getValor());
        i.setOrdemServico(os);
        os.getItensOrdemServico().add(i);
        calcularTotal();
        servico = null;
    }

    public void removerServico(ActionEvent event) {
        ItensOrdemServico i = (ItensOrdemServico) event.getComponent().getAttributes().get("itensOrdemServico");
        os.getItensOrdemServico().remove(i);
        calcularTotal();
    }

    public void calcularTotal() {
        BigDecimal total = BigDecimal.ZERO;
        for (ItensOrdemServico i : os.getItensOrdemServico()) {
            total = total.add(i.getValor());
        }
        os.setValor(total);
    }

    public List<Cliente> getClientes() {
        return clientes;
    }

    public void setClientes(List<Cliente> clientes) {
        this.clientes = clientes;
    }

    public Boolean getAtivoInativoConsultaServico() {
        return ativoInativoConsultaServico;
    }

    public void setAtivoInativoConsultaServico(Boolean ativoInativoConsultaServico) {
        this.ativoInativoConsultaServico = ativoInativoConsultaServico;
    }

    public String getCpfConsultaCliente() {
        return cpfConsultaCliente;
    }

    public void setCpfConsultaCliente(String cpfConsultaCliente) {
        this.cpfConsultaCliente = cpfConsultaCliente;
    }

    public String getCpfConsultaFuncionario() {
        return cpfConsultaFuncionario;
    }

    public void setCpfConsultaFuncionario(String cpfConsultaFuncionario) {
        this.cpfConsultaFuncionario = cpfConsultaFuncionario;
    }

    public List<Funcionario> getFuncionarios() {
        return funcionarios;
    }

    public void setFuncionarios(List<Funcionario> funcionarios) {
        this.funcionarios = funcionarios;
    }

    public ItensOrdemServico getItem() {
        return item;
    }

    public void setItem(ItensOrdemServico item) {
        this.item = item;
    }

    public List<ItensOrdemServico> getItens() {
        return itens;
    }

    public void setItens(List<ItensOrdemServico> itens) {
        this.itens = itens;
    }

    public List<OrdemServico> getOrdensServico() {
        return ordensServico;
    }

    public void setOrdensServico(List<OrdemServico> ordensServico) {
        this.ordensServico = ordensServico;
    }

    public OrdemServico getOs() {
        return os;
    }

    public void setOs(OrdemServico os) {
        this.os = os;
    }

    public Servico getServico() {
        return servico;
    }

    public void setServico(Servico servico) {
        this.servico = servico;
    }

    public List<Servico> getServicos() {
        return servicos;
    }

    public void setServicos(List<Servico> servicos) {
        this.servicos = servicos;
    }
}
